/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.isystem.autpart.util;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author klone
 */
public class Fecha {

    public Fecha() {
    }

    /**
     * extencion de java.util.SimpleDateFormat
     * @param formato
     *  String de formato ejemplo:
     * <center>getFecha("dd/MM/yyyy")<br /> return 05/04/2009</center>
     * @see SimpleDateFormat
     * @return
     */
    public static String getFecha(String formato) {
        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     *  Este metodo funciona con objets tipo sqlDate
     * @param formato
     * @param date
     * @return
     */
    public static String getFecha(String formato, java.sql.Date date) {
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     * Este metodo funciona con objets tipo utilDate
     * @param formato
     * @param date
     * @return
     */
    public static String getFecha(String formato, Date date) {
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     * retorna la fecha en español en formato YYYY/MMMM/DD
     * <sub>
     * <br />  YYYY= AÑO EN CUATRO DIGITOS ejemplo 2009
     * <br />  MMMM= MES EN ESPAÑOL ejemplo ABRIL
     * <br />  DD= DIA DEL MES  ejemplo 05</sub>
     * @param separador
     * Se usa para separar la cadena de fecha por ejemplo:
     * <br />
     * <center> getFechaCompletaEsp("/")
     * <br />return 2009/ABRIL/05  </center>
     * @return
     */
    public static String getFechaCompletaEsp(String separador) {
        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat("dd,MM,yyyy");

        StringBuffer buffer = new StringBuffer();
        StringTokenizer tokens = new StringTokenizer(formating.format(date), ",");
        buffer.append(tokens.nextElement().toString());
        buffer.append(" DE ");

        switch (Integer.parseInt(tokens.nextElement().toString())) {
            case 1:
                buffer.append("Enero");
                break;
            case 2:
                buffer.append("Febrero");
                break;
            case 3:
                buffer.append("Marzo");
                break;
            case 4:
                buffer.append("Abril");
                break;
            case 5:
                buffer.append("Mayo");
                break;
            case 6:
                buffer.append("Junio");
                break;
            case 7:
                buffer.append("Julio");
                break;
            case 8:
                buffer.append("Agosto");
                break;
            case 9:
                buffer.append("Septiembre");
                break;
            case 10:
                buffer.append("Octubre");
                break;
            case 11:
                buffer.append("Noviembre");
                break;
            case 12:
                buffer.append("Diciembre");
                break;
        }
        buffer.append(" DEL ");
        buffer.append(tokens.nextElement().toString());
        return buffer.toString();

    }

   
    public static String formatFecha(Date date) {
//        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat("dd,MM,yyyy");

        StringBuffer buffer = new StringBuffer();
        StringTokenizer tokens = new StringTokenizer(formating.format(date), ",");
        buffer.append(tokens.nextElement().toString());
        buffer.append(" DE ");

        switch (Integer.parseInt(tokens.nextElement().toString())) {
            case 1:
                buffer.append("Enero");
                break;
            case 2:
                buffer.append("Febrero");
                break;
            case 3:
                buffer.append("Marzo");
                break;
            case 4:
                buffer.append("Abril");
                break;
            case 5:
                buffer.append("Mayo");
                break;
            case 6:
                buffer.append("Junio");
                break;
            case 7:
                buffer.append("Julio");
                break;
            case 8:
                buffer.append("Agosto");
                break;
            case 9:
                buffer.append("Septiembre");
                break;
            case 10:
                buffer.append("Octubre");
                break;
            case 11:
                buffer.append("Noviembre");
                break;
            case 12:
                buffer.append("Diciembre");
                break;
        }
        buffer.append(" DEL ");
        buffer.append(tokens.nextElement().toString());
        return buffer.toString().toUpperCase();

    }

    public static String formatFecha_mini(Date date) {
//        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat("dd,MM,yyyy");

        StringBuffer buffer = new StringBuffer();
        StringTokenizer tokens = new StringTokenizer(formating.format(date), ",");
        buffer.append(tokens.nextElement().toString());
        buffer.append(" ");

        switch (Integer.parseInt(tokens.nextElement().toString())) {
            case 1:
                buffer.append("Ene");
                break;
            case 2:
                buffer.append("Feb");
                break;
            case 3:
                buffer.append("Mar");
                break;
            case 4:
                buffer.append("Abr");
                break;
            case 5:
                buffer.append("May");
                break;
            case 6:
                buffer.append("Jun");
                break;
            case 7:
                buffer.append("Jul");
                break;
            case 8:
                buffer.append("Ago");
                break;
            case 9:
                buffer.append("Sep");
                break;
            case 10:
                buffer.append("Oct");
                break;
            case 11:
                buffer.append("Nov");
                break;
            case 12:
                buffer.append("Dic");
                break;
        }
        buffer.append(" ");
        buffer.append(tokens.nextElement().toString());
        return buffer.toString().toUpperCase();

    }

    /**
     *Este metodo es utilizado para  saber en dos letras el dia de la semana<br />
     * y lo calcula por medio de la clase Calendar jsugando el dia de la semana
     * @return "Lu","Ma","Mi,"Ju","Vi","Sa","Do"
     * @see Calendar
     */
    public static String getDiaSemana() {
        String dia = "";
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        int diaInt = cal.get(Calendar.DAY_OF_WEEK);
        switch (diaInt) {
            case 1:
                dia = "Do";
                break;
            case 2:
                dia = "Lu";
                break;
            case 3:
                dia = "Ma";
                break;
            case 4:
                dia = "Mi";
                break;
            case 5:
                dia = "Ju";
                break;
            case 6:
                dia = "Vi";
                break;
            case 7:
                dia = "Sa";
                break;

        }
        return dia;
    }

    /**
     *Este metodo es utilizado para  saber en numero el dia de la semana<br />
     * y lo calcula por medio de la clase Calendar jsugando el dia de la semana
     * @return 1,2,3,4,5,6,7
     * @see Calendar
     */
    public static int getDiaSemanaInt() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        return cal.get(Calendar.DAY_OF_WEEK) + 1;
    }

    /**
     * Resta un determidado numero de minutos a una hora especificada en un Calendar
     * <b>NO SE PODRA RESTAR MAS DE 60MINUTOS</B>
     * @param cal
     * @param minutosAgregar
     * @see Calendar
     */
    public static Calendar restaMinutos(Calendar cal, int mintuosARestar) {
        Calendar calendar = Calendar.getInstance();
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minuto = cal.get(Calendar.MINUTE);
        if (minuto - mintuosARestar < 0) {
            int nuevoMinuto = 60 - mintuosARestar;
            calendar.set(0, 0, 0, hora - 1, nuevoMinuto);
        } else {
            calendar.set(0, 0, 0, hora, calendar.get(Calendar.MINUTE) - mintuosARestar);
        }
        return calendar;
    }

    /**
     * Agrega un determidado numero de minutos a una hora especificada en un Calendar
     * * <b>NO SE PODRA AGREGAR MAS DE 60MINUTOS</B>
     * @param cal
     * @param minutosAgregar
     * @see Calendar
     */
    public static Calendar agregaMinutos(Calendar cal, int minutosAgregar) {
        Calendar calendar = Calendar.getInstance();
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minuto = cal.get(Calendar.MINUTE);
        if (minuto + minutosAgregar >= 60) {
            int nuevoMinuto = minuto - 60;
            nuevoMinuto -= minutosAgregar;
            calendar.set(0, 0, 0, (hora + 1), nuevoMinuto, Calendar.MINUTE);
        } else {
            calendar.set(0, 0, 0, hora, cal.get(Calendar.MINUTE) + minutosAgregar);
        }
        return calendar;
    }

    /**
     * comp es el Calendar a comparar return true si cal menor comp si no false
     * @param cal
     * @param comp
     * @return
     */
    public static boolean esMenor(Calendar cal, Calendar comp) {
        if (cal.compareTo(comp) <= 0) {
            return true;
        } else {
            return false;
        }

    }

    /**
     *
     * @param cal
     * @param comp
     * @return
     */
    public static boolean esMayorIgual(Calendar cal, Calendar comp) {

        if (cal.compareTo(comp) > 0) {
            return true;

        } else {
            return false;
        }

    }

    /**
     *
     * @param buscar
     * @param menor
     * @param mayor
     * @return boolean
     */
    public static boolean esEntre(Calendar buscar, Calendar menor, Calendar mayor) {

        if (esMayorIgual(buscar, menor) && esMenor(buscar, mayor)) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * Este metodo funciona para encontrar la diferencia en dias entre dos Calendar
     * @param inicio
     * @param fin
     * @return
     */
    public static long diferenciaDates(Calendar inicio, Calendar fin) {
        long diferenciaMilis = fin.getTimeInMillis() - inicio.getTimeInMillis();
        long diferenciaDias = diferenciaMilis / (1000 * 60 * 60 * 24);
        return diferenciaDias;

    }

//como se pueden ver todos los metodos son estatic s aqui les pongo el ejemplo de como se podrian utilizar ya en un main 
    @SuppressWarnings("static-access")
    public static void main(String args[]) {

        System.out.println("la hora actual es ==>" + hora_actual());
//        SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy");
//        Date d = new Date();
////        System.out.println("formato " + formatFecha(d));
////        String fx = "20 DE OCTUBRE DEL 2011";
////        
//        System.out.println("convert ===" + getFechaCompletaEsp(d, true));
//        System.out.println("convert ===" + getFechaCompletaEsp(d, false));
//        System.out.println("antes==" + f.format(d));
//        System.out.println("despues==" + f.format(moverDia(d, -10)));
    }
    
    public static String getFechaCompletaEsp(Date date, boolean inletas) {
        numeroTexto conv = new numeroTexto();
        SimpleDateFormat formating = new SimpleDateFormat("dd,MM,yyyy");

        StringBuffer buffer = new StringBuffer();
        StringTokenizer tokens = new StringTokenizer(formating.format(date), ",");
        if (inletas) {
            buffer.append(conv.numToChar(tokens.nextElement().toString()));
        } else {
            buffer.append(tokens.nextElement().toString());
        }

        buffer.append(" DE ");
        switch (Integer.parseInt(tokens.nextElement().toString())) {
            case 1:
                buffer.append("Enero");
                break;
            case 2:
                buffer.append("Febrero");
                break;
            case 3:
                buffer.append("Marzo");
                break;
            case 4:
                buffer.append("Abril");
                break;
            case 5:
                buffer.append("Mayo");
                break;
            case 6:
                buffer.append("Junio");
                break;
            case 7:
                buffer.append("Julio");
                break;
            case 8:
                buffer.append("Agosto");
                break;
            case 9:
                buffer.append("Septiembre");
                break;
            case 10:
                buffer.append("Octubre");
                break;
            case 11:
                buffer.append("Noviembre");
                break;
            case 12:
                buffer.append("Diciembre");
                break;
        }
        buffer.append(" DEL ");
        if (inletas) {
            buffer.append(conv.numToChar(tokens.nextElement().toString()));
        } else {
            buffer.append(tokens.nextElement().toString());
        }
        return buffer.toString().toUpperCase();

    }


    public static String getCurrency(String number) {
        double value = 0.00;
        try {
            value = Double.parseDouble(number);
        } catch (NumberFormatException ex) {
            value = 0.00;
        }
        DecimalFormat Currency = new DecimalFormat("###,###,###,##0.00");
//        double amount = 102300.0156;
//                System.out.print ("With "+amount+ " recipients ");
        String howmuch = Currency.format(value);
        howmuch = howmuch.replace(",", "-");
        howmuch = howmuch.replace(".", ",");
        howmuch = howmuch.replace("-", ".");
        return howmuch;
    }

    public static int anio_actual() {
        Calendar calendario = new GregorianCalendar();
        int anio_actual = calendario.get(Calendar.YEAR);
//        System.out.println(anio_actual);
        return anio_actual;
    }

    public static String hora_actual() {
        Calendar calendario = new GregorianCalendar();
        //Calendar calendario = Calendar.getInstance();

        int hora, minutos, segundos;
        String aux = "AM";
        hora = calendario.get(Calendar.HOUR_OF_DAY);
        if (hora > 12) {

            hora = hora - 12;
            aux = "PM";
        } else {
            if (hora == 12) {
                aux = "PM";
            } else {
                aux = "AM";
            }

        }
        minutos = calendario.get(Calendar.MINUTE);
        segundos = calendario.get(Calendar.SECOND);

//        System.out.println(format(hora, 2) + ":" + format(minutos, 2) + ":" + format(segundos, 2) + " " + aux);
//        return format(hora, 2) + ":" + format(minutos, 2) + ":" + format(segundos, 2) + " " + aux;
        return format(hora, 2) + ":" + format(minutos, 2) + " " + aux;
    }

   
    public static String hora_actual2() {
        Calendar calendario = new GregorianCalendar();
        //Calendar calendario = Calendar.getInstance();

        int hora, minutos, segundos;

        hora = calendario.get(Calendar.HOUR_OF_DAY);
        minutos = calendario.get(Calendar.MINUTE);
        segundos = calendario.get(Calendar.SECOND);

//        System.out.println(format(hora, 2) + ":" + format(minutos, 2) + ":" + format(segundos, 2) + " " + aux);
        return format(hora, 2) + ":" + format(minutos, 2) + ":" + format(segundos, 2);
    }

    public static String format(int n, int cifras) {
        String numero = n + "";
        String result = "";
        for (int i = 0; i < cifras - numero.length(); i++) {
            result = "0" + result;
        }
        result = result + n;
        return result;
    }
    
    public static Date periodo(int date, int k, int periodo) {
        Date d1 = new Date();
        d1.setDate(date);
        int total_dias = k * periodo;
//        System.out.println("dias="+total_dias);
        if (periodo == 30) {
//            System.out.println("un mes");
            d1.setMonth(d1.getMonth() + k); // .setDate(d.getDate()+total_dias);
        } else {
//            System.out.println("dias diferentes");
            d1.setDate(d1.getDate() + total_dias);
        }
        if (getDiaSemana(d1).equals("Do")) {
            d1.setDate(d1.getDate() + 1);
        }
        System.out.println("=>" + getDiaSemana(d1));
        return d1;
    }

    public static String getDiaSemana(Date d) {
        String dia = "";
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        int diaInt = cal.get(Calendar.DAY_OF_WEEK);
        switch (diaInt) {
            case 1:
                dia = "Do";
                break;
            case 2:
                dia = "Lu";
                break;
            case 3:
                dia = "Ma";
                break;
            case 4:
                dia = "Mi";
                break;
            case 5:
                dia = "Ju";
                break;
            case 6:
                dia = "Vi";
                break;
            case 7:
                dia = "Sa";
                break;

        }
        return dia;
    }

    public static String getDay(int date) {
        Date d1 = new Date();
        d1.setDate(date);
        String d = d1.getDate() + "";
        return d;
    }

    public static String getMes(Date date) {
//        Date d1 = new Date();
//        d1.setDate(date);
//        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat("yyyy,MM,dd");
        String mes = "";
        StringBuffer buffer = new StringBuffer();
        StringTokenizer tokens = new StringTokenizer(formating.format(date), ",");
        buffer.append(tokens.nextElement().toString());
//        buffer.append(separador1);

        switch (Integer.parseInt(tokens.nextElement().toString())) {
            case 1:
//                buffer.append("Enero");
                mes = "Enero";
                break;
            case 2:
                buffer.append("Febrero");
                mes = "Febrero";
                break;
            case 3:
                buffer.append("Marzo");
                mes = "Marzo";
                break;
            case 4:
                buffer.append("Abril");
                mes = "Abril";
                break;
            case 5:
                buffer.append("Mayo");
                mes = "Mayo";
                break;
            case 6:
                buffer.append("Junio");
                mes = "Junio";
                break;
            case 7:
                buffer.append("Julio");
                mes = "Julio";
                break;
            case 8:
                buffer.append("Agosto");
                mes = "Agosto";
                break;
            case 9:
                buffer.append("Setiembre");
                mes = "Setiembre";
                break;
            case 10:
                buffer.append("Octubre");
                mes = "Octubre";
                break;
            case 11:
                buffer.append("Noviembre");
                mes = "Noviembre";
                break;
            case 12:
                buffer.append("Diciembre");
                mes = "Diciembre";
                break;
        }
//        buffer.append(separador);
//        buffer.append(tokens.nextElement().toString());

//        return buffer.toString().toUpperCase();
        return mes.toUpperCase();
    }

//    Sumar un dia a la fecha actual
    public static Date moverDia(Date date, int n) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, n);    //Adding 1 day to current date
        return cal.getTime();
    }
    //Sumar un mes a la fecha actual

    public static Date moverMes(Date date, int n) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, n);    //Adding 1 month to current date
        return cal.getTime();
    }

    public static Date moverAño(Date date, int n) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.YEAR, n);    //Adding 1 year to current date
        return cal.getTime();
    }
    //falta funcion que comvierta el anterio en el actual :(

    public static Date StrtoDate(String fx) {
        fx = fx.replace(" DE ", "-");
        fx = fx.replace(" DEL ", "-");

        String[] aux = fx.split("-");
        String dia = aux[0];
        String mes = aux[1];
        String año = aux[2];
        String Mes = "";


        if (mes.equals("ENERO")) {
            Mes = "01";
        } else if (mes.equals("FEBRERO")) {
            Mes = "02";
        } else if (mes.equals("MARZO")) {
            Mes = "03";
        } else if (mes.equals("ABRIL")) {
            Mes = "04";
        } else if (mes.equals("MAYO")) {
            Mes = "05";
        } else if (mes.equals("JUNIO")) {
            Mes = "06";
        } else if (mes.equals("JULIO")) {
            Mes = "07";
        } else if (mes.equals("AGOSTO")) {
            Mes = "08";
        } else if (mes.equals("SEPTIEMBRE")) {
            Mes = "09";
        } else if (mes.equals("OCTUBRE")) {
            Mes = "10";
        } else if (mes.equals("NOVIEMBRE")) {
            Mes = "11";
        } else if (mes.equals("DICIEMBRE")) {
            Mes = "12";
        }

        String date_final = dia + "-" + Mes + "-" + año;

        Date date = null;
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
        try {
            date = df.parse(date_final);
        } catch (ParseException ex) {
            Logger.getLogger(Fecha.class.getName()).log(Level.SEVERE, null, ex);
        }

        return date;
    }
}
